/**
 * @file comum.h
 * Definições comuns para todos os módulos.
 */

#ifndef COMUM_H_
#define COMUM_H_

#include <stdio.h>
#include <stdbool.h>


/**
 * Altura e largura do terreno.
 */
#define TAM_LADO 100


/**
 * Maior distância que a formiga pode se afastar do formigueiro.
 *
 * Essa é a quantidade máxima de pontos, na matriz, que a formiga pode
 * percorrer antes de ter que voltar para o formigueiro. Se a formiga percorrer
 * essa distância, ela volta para o formigueiro, independente de ter encontrado
 * comida ou não.
 */
#define MAX_CAMINHO 3000


/**
 * Quantidade máxima de formigas de pode haver na simulação.
 */
#define MAX_FORMIGAS 20


/**
 * Quantidade máxima de turnos da simulação.
 */
#define MAX_TURNOS 50


/**
 * Quantidade máxima de ferormônio que a formiga pode colocar em cada céulula.
 */
#define MAX_FERORMONIO 2000.0


/**
 * Maior taxa de evaporação possível para o ferormônio.
 */
#define MAX_EVAPORACAO 50


/// Quantidade de turnos da simulação.
int turnos;

/// Quantidade média de ferormônio que as formigas depositam quando encontram comida.
float qtdferormonio;

/// Taxa de evaporação do ferormônio.
int evaporacao;


/**
 * Representa um ponto na matriz do terreno.
 */
typedef struct {
	int x;		///< Coordenada x do ponto
	int y;		///< Coordenada y do ponto
} Ponto;


/**
 * O terreno da simulação.
 *
 * Um terreno é a representação em C do box ou elevation grid em VRML que será
 * usado na simulação. É o lugar onde estarão o formigueiro, as comidas, os
 * obstáculos e por onde as formigas irão andar.
 */
struct {
	int ferormonio[TAM_LADO][TAM_LADO];	///< Quantidade de ferormônio em cada ponto da matriz
	Ponto formigueiro;						///< Coordenadas do formigueiro
	int custo[TAM_LADO][TAM_LADO];		///< Custo de cada ponto da matriz
	bool comida[TAM_LADO][TAM_LADO];		///< Indica, para cada ponto da matriz, se há comida ou não
	FILE *vrml;								///< O arquivo VRML gerado para esse terreno
} terreno;


typedef enum {
	N, NE, L, SE, S, SO, O, NO
} Direcao;


/**
 * Representa uma formiga.
 *
 * Esssa estrutura é uma abstração de alto nível do objeto de uma formiga em
 * VRML. Além disso, ela armazena o comportamento da formiga, encapsulando tudo
 * que é necessário para manipular uma formiga na simulação.
 */
typedef struct {
	int id;
	int x;							///< Coordenada x atual da formiga
	int y;							///< Coordenada y atual da formiga
	Direcao frente;					///< Em que direção a formiga está andando
	bool voltando;					///< Informa se a formiga está voltando para o formigueiro ou não
	bool encontrou;					///< Informa se a formiga encontrou comida nesse turno ou não
	Ponto caminho[MAX_CAMINHO];		///< Os pontos pelos quais a formiga passou na ida e que deve segui-los na volta
	int caminho_length;
	FILE *vrml;						///< Arquivo VRML associado a essa formiga
} Formiga;


#endif
